﻿using System;
using System.Collections.Generic;
using System.Configuration;  
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;                                                                                             //添加调用：
using System.Data.SqlClient;                                                                                //包含访问SQL Server所需的各类对象；

namespace 住院医生工作站
{
    
    /// <summary>
    /// 教学管理窗体；
    /// </summary>
    public partial class frm_MedicineManagement : Form
    {

        /// <summary>
        /// 公有方法：构造函数；
        /// </summary>
        public frm_MedicineManagement()
        {
            InitializeComponent();
            this.StartPosition = FormStartPosition.CenterScreen;                                            //本窗体启动位置设为屏幕中央；
            this.dgv_Medicine.AllowUserToAddRows = false;                                                    //数据网格视图不允许用户添加行；
            this.dgv_Medicine.RowHeadersVisible = false;                                                     //数据网格视图的行标题不可见；
            this.dgv_Medicine.BackgroundColor = Color.White;                                                 //数据网格视图的背景色设为白色；
            this.dgv_Medicine.AutoSizeColumnsMode =                                                         
                DataGridViewAutoSizeColumnsMode.AllCells;                                                   //数据网格视图的自动调整列宽模式设为显示所有单元格；
        }

        /// <summary>
        /// 私有方法：点击载入按钮；
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Load_Click(object sender, EventArgs e)
        {
            SqlConnection sqlConnection = new SqlConnection();                                              //声明并实例化SQL连接；
            sqlConnection.ConnectionString =
              ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;                        //在字符串变量中，描述连接字符串所需的服务器地址、数据库名称、集成安全性（即是否使用Windows验证）；
            SqlCommand sqlCommand = new SqlCommand();                                                       //声明并实例化SQL命令；
            sqlCommand.Connection = sqlConnection;                                                          //将SQL命令的连接属性指向SQL连接；
            sqlCommand.CommandText =                                                                        //指定SQL命令的命令文本；
                "SELECT * FROM tb_MedicineSort;"                                                              //该命令分别查询所有院系、专业、班级，查询结果将返回多张表；
                + "SELECT * FROM tb_Medicine;"
                + "SELECT * FROM tb_MedicineSolution;";                                           
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                           //声明并实例化SQL数据适配器，同时借助构造函数，将其SelectCommand属性设为先前创建的SQL命令；
            sqlDataAdapter.SelectCommand = sqlCommand;                                                      //将SQL数据适配器的查询命令属性指向SQL命令；
            DataSet dataSet = new DataSet();                                                                //声明并实例化数据集，用于保存查得的多张表；
            sqlConnection.Open();                                                                           //打开SQL连接；
            sqlDataAdapter.Fill(dataSet);                                                                   //SQL数据适配器读取数据，并填充数据集；
            sqlConnection.Close();                                                                          //关闭SQL连接；
            DataTable MedicineSortTable = dataSet.Tables[0];                                                  //声明院系数据表，对应数据集的表集合中的第1张数据表；
            DataTable MedicineTable = dataSet.Tables[1];                                                       //声明专业数据表，对应数据集的表集合中的第2张数据表；
            DataTable MedicineSolutionTable = dataSet.Tables[2];                                                       //声明班级数据表，对应数据集的表集合中的第3张数据表；
            DataRelation[] dataRelations =                                                                  //声明数据关系数组；
            {
                new DataRelation                                                                            //实例化数据关系，实现院系表、专业表之间的层次关系；
                    ("MedicineSort_Medicine"                                                                     //数据关系名称；
                    , MedicineSortTable.Columns["No"]                                                         //父表的被参照列为院系表的编号列；
                    , MedicineTable.Columns["MedicineSortNo"]                                                    //子表的参照列为专业表的院系编号列；
                    , false)                                                                                //不创建约束（父列上的唯一约束、子列上的外键约束）；
                , new DataRelation                                                                          //实例化数据关系，实现专业表、班级表之间的层次关系；
                    ("Medicine_MedicineSolution"                                                                          //数据关系名称；
                    , MedicineTable.Columns["No"]                                                              //父表的被参照列为专业表的编号列；
                    , MedicineSolutionTable.Columns["MedicineNo"]                                                         //子表的参照列为班级表的专业编号列；
                    , false)                                                                                //不创建约束（父列上的唯一约束、子列上的外键约束）；
            };
            dataSet.Relations.AddRange(dataRelations);                                                      //将数据关系数组批量加入数据集的关系集合中；
            this.trv_EducationUnit.Nodes.Clear();                                                           //树形视图的节点集合清空；
            foreach (DataRow MedicineSortRow in MedicineSortTable.Rows)                                         //遍历院系数据表中的每一数据行；
            {
                TreeNode MedicineSortNode = new TreeNode();                                                   //声明并实例化院系节点，该节点对应当前某个院系；
                MedicineSortNode.Text = MedicineSortRow["Name"].ToString();                                     //院系节点的文本设为当前院系的名称；
                this.trv_EducationUnit.Nodes.Add(MedicineSortNode);                                           //将院系节点加入树形视图的（根）节点集合；
                foreach (DataRow MedicineRow in MedicineSortRow.GetChildRows("MedicineSort_Medicine"))                //借助先前定义的数据关系，遍历当前院系所在数据行的子行，即下属所有专业；
                {
                    TreeNode MedicineNode = new TreeNode();                                                    //声明并实例化专业节点，该节点对应当前某个专业；
                    MedicineNode.Text = MedicineRow["Name"].ToString();                                           //专业节点的文本设为当前专业的名称；
                    MedicineSortNode.Nodes.Add(MedicineNode);                                                    //专业节点加入当前院系节点的节点集合，成为第1级节点之一；
                    foreach (DataRow MedicineSolutionRow in MedicineRow.GetChildRows("Medicine_MedicineSolution"))                      //借助先前定义的数据关系，遍历当前专业所在数据行的子行，即下属所有班级；
                    {
                        TreeNode MedicineSolutionNode = new TreeNode();                                                //声明并实例化班级节点，该节点对应当前某个班级；
                        MedicineSolutionNode.Text = MedicineSolutionRow["Solution"].ToString();                                       //班级节点的文本设为当前班级的名称；
                        MedicineSolutionNode.Tag = MedicineSolutionRow["No"];                                                     //班级节点的标签设为当前班级的编号；
                        MedicineNode.Nodes.Add(MedicineSolutionNode);                                                     //班级节点加入当前专业节点的节点集合，成为第2级节点之一；
                    }
                }
            }
        }

        /// <summary>
        /// 私有方法：选择教学单位树形视图；
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trv_EducationUnit_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (this.trv_EducationUnit.SelectedNode.Level == 2)                                             //若树形视图的选中节点的级别为3，即选中班级节点；
            {
                int MedicineSolutionNo = (int)this.trv_EducationUnit.SelectedNode.Tag;                                 //将树形视图的选中节点的标签转为整型，即可获得事先保存的班级编号；
                SqlConnection sqlConnection = new SqlConnection();                                          //声明并实例化SQL连接；
                sqlConnection.ConnectionString =
                ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;                          //在字符串变量中，描述连接字符串所需的服务器地址、数据库名称、集成安全性（即是否使用Windows验证）；
                SqlCommand sqlCommand = new SqlCommand();                                                   //声明并实例化SQL命令；
                sqlCommand.Connection = sqlConnection;                                                      //将SQL命令的连接属性指向SQL连接；
                sqlCommand.CommandText = "SELECT No,MedicineName,Solution,Symptom FROM tb_MedicineData WHERE MedicineSolutionNo=@MedicineSolutionNo;";          //指定SQL命令的命令文本；该命令查询当前选中班级的所有学生名单，以用作数据网格视图数据源；
                sqlCommand.Parameters.AddWithValue("@MedicineSolutionNo", MedicineSolutionNo);                                    //向SQL命令的参数集合添加参数的名称、值；
                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                       //声明并实例化SQL数据适配器，同时借助构造函数，将其SelectCommand属性设为先前创建的SQL命令；
                sqlDataAdapter.SelectCommand = sqlCommand;                                                  //将SQL数据适配器的查询命令属性指向SQL命令；
                DataTable MedicineDataTable = new DataTable();                                                   //声明并实例化数据表，用于保存当前选中班级的所有学生名单，以用作数据网格视图的数据源；
                sqlConnection.Open();                                                                       //打开SQL连接；
                sqlDataAdapter.Fill(MedicineDataTable);                                                          //SQL数据适配器读取数据，并填充班级数据表；
                sqlConnection.Close();                                                                      //关闭SQL连接；
                this.dgv_Medicine.DataSource = MedicineDataTable;                                                 //设置数据网格视图的数据源；
                this.dgv_Medicine.Columns["No"].HeaderText = "编号";                                         //将数据网格视图的指定列的表头文本设为中文；
                this.dgv_Medicine.Columns["MedicineName"].HeaderText = "药品名";
                this.dgv_Medicine.Columns["Solution"].HeaderText = "使用方式";
                this.dgv_Medicine.Columns["Symptom"].HeaderText = "治疗症状";
                this.dgv_Medicine.Columns[this.dgv_Medicine.Columns.Count - 1].AutoSizeMode =                 //数据网格视图的最后一列的自动调整列宽模式设为填充（至数据网格视图右侧边缘）；
                    DataGridViewAutoSizeColumnMode.Fill;
            }
        }
    }                                                                                                    
}
